#include "asa.h"
#define TAMANHO_PRIMO               227
#define TAMANHO_STRING_LEXEMA       1024
#define TAMANHO_CRESC_STRING_LEXEMA 512

#define SIMBOLO_INATIVO 0
#define SIMBOLO_ATIVO   1

#define SEM_ESCOPO      -1
#define SEM_TIPO        -1

#define NAO_EH_FUNCAO   0
#define EH_FUNCAO       1

#define NAO_EH_TYPEDECL   0
#define EH_TYPEDECL       1

#define NAO_EH_ARRAY    0
#define EH_ARRAY        1

#ifndef STRUCT_SIMBOLO
//Estrutura criada para manter um Simbolo que pode
//ser inserido na Tabela de Simbolos. Seus atributos sao:
//1) Posicao: que guarda a posicao no vetor de lexemas;
//2) Token: que representa o Token a que se enquadra o simbolo;
//3) Proximo: ponteiro que aponta para o proximo simbolo,
//   pois a tabela de simbolos eh implementada de forma a se
//   comportar como uma lista encadeada.
typedef struct _simbolo {
    int posicao;
    int token;
    int escopo;
    int status; //Ativo ou Inativo
    int tipo;   //INT, FLOAT, BOOLEAN ou STRUCT ID
    int funcao; //Flag que indica se o simbolo eh funcao
    char* funcaoPai; //Nome da funcao a que pertence o simbolo (soh eh usado
                     //em simbolos diferentes de funcao)
    int typeDecl;    //Flag que indica se o simbolo eh typeDecl
    int array;  //Flag que indica se eh array
    int offset;
    int size;
    VarList *parametros;
    InFrame* inFrame;
    struct _simbolo* proximo;
} simbolo;//Definicao da Tabela de Simbolos.
#endif
#define STRUCT_SIMBOLO

simbolo* buscaGambi (char* nome);
int calculaTamanhoRegistro(simbolo* s);
int busca(char* lexema);
char* buscaNomePai(int tipo);
simbolo* buscaSimbolo(char* lexema, int escopo);
simbolo* buscaSimboloPai(char* lexema, char* funcaoPai);
void adicionaLexemaString(char* c);
void expandeLexemaString();
char* getLexemaString(unsigned int inicio);
void inicializaStringLexema();
int getPonteiroStringLexema();
void limpaTabela();
void imprimeTabelaSimbolos();
void desativaSimbolosEscopo(int escopo);
int adicionaLexema(char* lexema, int token, int escopo, int tipo, int funcao, char* funcaoPai, int status, int typeDecl, int array);
